package kyssion.leetcode.num1_50;


import java.util.Arrays;

/**
 * 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数，使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
 * <p>
 * 例如，给定数组 nums = [-1，2，1，-4], 和 target = 1.
 * <p>
 * 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
 */
public class code16_最接近的三数之和 {

    public static void main(String[] args) {
        System.out.println(new code16_最接近的三数之和().threeSumClosest(new int[]{
                -1, 2, 1, -4
        }, 1));
    }

    /**
     * 题目和code15 类似,这里就不做特殊的优化了
     *
     * @param nums
     * @param target
     * @return
     */
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int cha = Integer.MAX_VALUE;
        for (int a = 0; a < nums.length; a++) {
            int left = a + 1;
            int right = nums.length - 1;
            while (left < right) {
                int now = nums[a] + nums[left] + nums[right];
                if (now == target) {
                    return target;
                } else {
                    cha = Math.abs(target - now) < Math.abs(target - cha)?
                            now : cha;
                }
                while (left < right && nums[left] == nums[left + 1]) {
                    left++;
                }
                while (left < right && nums[right] == nums[right - 1]) {
                    right--;
                }
                if (cha > target) {
                    right--;
                } else {
                    left++;
                }
            }
        }
        return cha;
    }
}
